/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.siagefi.service;

import br.siagefi.dao.DAO;
import br.siagefi.model.Banco;
import br.siagefi.model.ContaBancaria;
import br.siagefi.model.Documento;
import br.siagefi.model.Lancamento;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

/**
 *
 * @author NOTE
 */
public class ContaBancariaService {

    private final DAO<ContaBancaria> dao;

    public ContaBancariaService() {
        this.dao = new DAO<>(ContaBancaria.class);
    }

    public void inserir(ContaBancaria conta) {
        dao.adiciona(conta);
    }

    public void alterar(ContaBancaria conta) {
        dao.atualiza(conta);
    }

    public List<ContaBancaria> listar() {
        return dao.listaTodos();
    }

    public void remover(ContaBancaria conta) {
        dao.remove(conta);
    }

    public boolean jaExiste(ContaBancaria conta) {
        List<ContaBancaria> lista = this.listar();
        for (ContaBancaria c : lista) {
            if (c.equals(conta)) {
                return true;
            }
        }
        return false;
    }

    public boolean existeLancamentoVinculado(ContaBancaria conta) {
        return !(conta.getLancamentos().isEmpty());
    }
    
    public boolean exiteContaMesmoNome(ContaBancaria conta){
          for (ContaBancaria c : this.listar()) 
            if(conta.getNome().equalsIgnoreCase(c.getNome()) && (!c.getId().equals(conta.getId()))){
                    return true;
            }
          return false;
    }

    public List<ContaBancaria> consultaContasPorBanco(Banco banco) {
        return dao.consultar("Conta.buscaPorBanco", banco);
    }

    public boolean existeLancamentoVinculadoAVencer(ContaBancaria conta) {
        List<Lancamento> lista = conta.getLancamentos();
        Date dataAtual = Calendar.getInstance().getTime();
        for (Lancamento l : lista) {
            if (l.getDataPagamento().compareTo(dataAtual) >= 0) {
                return true;
            }
        }
        return false;
    }
    
    public void atualizaSaldo(Documento documento) {
        for (Lancamento lcto : documento.getLancamentos()) {
            lcto.getConta().atualizaSaldo(lcto.getValor(), lcto.getTipo());
         }
        this.alterar(documento.getConta());
    }

}
